/**
 * public    公开的     可以被类内部，子类，类外部访问
 * protected 受保护的   可以被类内部，子类访问
 * private   私有的     可以被类内部访问
 * readonly  只读属性   属性无法修改
 * 
 */

// 简写前
class Person {
    public name: string
    age: number
    constructor(name: string, age: number) {
        this.name = name
        this.age = age
    }
    speak() {
        console.log(`我叫${this.name}，今年${this.age}岁`)
    }
}

class Student extends Person {
    study() {
        console.log(`${this.name}正在努力学习中......`)
    }
}
const p1 = new Person('tom', 16)
console.log(p1.name, p1.age, p1.speak())

// 简写
class Person1 {
    constructor(
        public name: string,
        public age: number) { }
}
const p2 = new Person1('tom1', 18)
console.log(p2.name, p2.age)


// protected 受保护的   可以被类内部，子类访问
class Person2 {
    constructor(protected name: string, protected age: number) { }
    protected getDetails() {
        return `我叫：${this.name}，年龄是${this.age}`
    }
    introduce() {
        console.log(this.getDetails())
    }
}

const p3 = new Person2('tom', 18)
// 这几个属性受保护不能在类外部调用
// p3.name
// p3.age
// p3.getDetails()
p3.introduce()

class Student1 extends Person2 {
    study() {
        console.log(this.getDetails())
        console.log(`${this.name}正在学习`)
    }
}
const s2 = new Student1('tom', 21)
s2.study()

// private   私有的     可以被类内部访问

class Person3 {
    constructor(
        protected name: string,
        protected age: number,
        private IDCard: string
    ) { }
    private getPrivateInfo() {
        return `身份证号码为：${this.IDCard}`
    }
    getInfo() {
        return `我叫${this.name}，今年刚满${this.age}岁`
    }
    getFullInfo() {
        return this.getInfo() + ',' + this.getPrivateInfo()
    }
}

const p4 = new Person3('tom', 18, '12312321')
// 以下注释表示属性不可访问
// p4.name
// p4.age
// p4.IDCard
// p4.getPrivateInfo()
p4.getInfo()
p4.getFullInfo()


// readonly  只读属性   属性无法修改
class ReadonlyPeroson {
    constructor(
        public readonly vin: string,
        public readonly year: number,
        public color: string,
        public sound: string
    ) { }

    displayInfo() {
        console.log(`
            识别码${this.vin}，
            出厂年份:${this.year}，
            颜色${this.color}，
            音响${this.sound}
        `)
    }
}